0.1 Load all of the throw data

#load omnibus dataframe
omnibus_df <- read_delim("../data/processed/omnibus/omnibus_raw.csv", 
                            delim = ",", 
                            col_types = cols(.default = col_double(), 
                                             type = col_factor(),
                                             ppid = col_factor(),
                                             exp_label = col_factor(),
                                             experiment = col_factor(),
                                             hand = col_factor(),
                                             camera_tilt = col_factor(),
                                             surface_tilt = col_factor(),
                                             target = col_factor(),
                                             surface = col_factor(),
                                             anim_type = col_factor()))
Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)
original_exps <- c("rot15_cued_tilt", "rot15_uncued", "tilt_uncued_rot", 
                   "tilt_uncued_norot", "tilt_cued_rot", "tilt_cued_norot")

1 Visualizing data (univariate)

test_ppt <- 3

test_df <- omnibus_df %>% filter(ppid == test_ppt)


trial <- 250
trial_df <- filter(test_df, trial_num == trial)

x <- trial_df$flick_velocity_x
y <- trial_df$flick_velocity_y
z <- trial_df$flick_velocity_z

x2 <- trial_df$flick_direction_x
y2 <- trial_df$flick_direction_y
z2 <- trial_df$flick_direction_z

# plot both
plot_ly(x = c(0, x), y = c(0, y), z = c(0, z), type = "scatter3d", mode = "lines") %>%
  add_trace(x = c(0, x2), y = c(0, y2), z = c(0, z2), type = "scatter3d", mode = "lines") %>%
  layout(scene = list(xaxis = list(title = "x"),
                      yaxis = list(title = "y"),
                      zaxis = list(title = "z")))

# note: this is a rotated trial
# plot distribution of error_size
p <- ggplot(omnibus_df, aes(x = error_size)) +
  geom_histogram(binwidth = .5) +
  theme_minimal() +
  theme(text = element_text(size = 11)) +
  labs(x = "Error Size (cm)", y = "Count")

p

2 Group

2.1 All throws

# try just animate_surface exp
animate_surface_trial_summary_df <- omnibus_df %>%
  filter(exp_label == "animate_surface") %>%
  group_by(trial_num) %>%
  summarise(
    mean_deviation = mean(throw_deviation),
    ci_deviation = vector_confint(throw_deviation)
  )

data <- animate_surface_trial_summary_df

# set up plot
p <- data %>%
  ggplot(
    aes(
      x = trial_num, y = mean_deviation
    )
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  labs(
    x = "Trial Number",
    y = "Throw Angle (°)"
  )

# add horizontal lines
p <- p +
  geom_hline(
    yintercept = c(0, -30), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "solid"
  ) +
  geom_hline(
    yintercept = c(-15), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "dashed"
  )

# p <- p +
#   scale_y_continuous(
#     limits = c(-10, 35),
#     breaks = c(0, 15, 30),
#     labels = c(0, 15, 30)
#   ) +
#   scale_x_continuous(
#     limits = c(0, 180),
#     breaks = c(0, 60, 120, 180),
#     labels = c(0, 60, 120, 180)
#   )

# set font size to 11
p <- p +
  theme(text = element_text(size = 11))

# add confidence intervals
p <- p + geom_ribbon(
  aes(
    ymin = mean_deviation - ci_deviation,
    ymax = mean_deviation + ci_deviation
  ),
  fill = "#d40000", colour = NA, alpha = 0.3
  )


# add data
p <- p + geom_line(colour = "#d40000")


# # save
# if (save_plots) {
#   ggsave(
#   p,
#   filename = "../plots/paper_figs/sr_30_training.pdf", device = "pdf",
#   height = 4, width = 6
#   )
#   }

ggplotly(p)
# p
# rest of the exps
original_exps_trial_summary_df <- omnibus_df %>%
  filter(exp_label == "original_exps") %>%
  group_by(experiment, trial_num) %>%
  summarise(
    mean_deviation = mean(throw_deviation),
    ci_deviation = vector_confint(throw_deviation)
  )
`summarise()` has grouped output by 'experiment'. You can override using the `.groups` argument.
data <- original_exps_trial_summary_df

# set up plot
p <- data %>%
  ggplot(
    aes(
      x = trial_num, y = mean_deviation, colour = experiment
    )
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  labs(
    x = "Trial Number",
    y = "Throw Angle (°)"
  )

# add horizontal lines
p <- p +
  geom_hline(
    yintercept = c(0, -30), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "solid"
  ) +
  geom_hline(
    yintercept = c(-15), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "dashed"
  )

# p <- p +
#   scale_y_continuous(
#     limits = c(-10, 35),
#     breaks = c(0, 15, 30),
#     labels = c(0, 15, 30)
#   ) +
#   scale_x_continuous(
#     limits = c(0, 180),
#     breaks = c(0, 60, 120, 180),
#     labels = c(0, 60, 120, 180)
#   )

# set font size to 11
p <- p +
  theme(text = element_text(size = 11))

# add confidence intervals
p <- p + geom_ribbon(
  aes(
    ymin = mean_deviation - ci_deviation,
    ymax = mean_deviation + ci_deviation,
    fill = experiment
  ), colour = NA, alpha = 0.3
  )


# add data
p <- p + geom_line()


# # save
# if (save_plots) {
#   ggsave(
#   p,
#   filename = "../plots/paper_figs/sr_30_training.pdf", device = "pdf",
#   height = 4, width = 6
#   )
#   }

ggplotly(p)

# p
ggplotly(plot_original_learning_curve(omnibus_path))
Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)

Plot all the trials and see if there are group effects.

all_throw_summary <- omnibus_df %>%
  group_by(experiment, trial_num) %>%
  summarise(mean = mean(error_size, na.rm = TRUE),
            sd = sd(error_size, na.rm = TRUE), 
            ci = vector_confint(error_size),
            n = n(), .groups = "drop")
p <- omnibus_df %>%
  ggplot(aes(x = trial_num, y = error_size)) +
  # geom_point(alpha = 0.04, aes(colour = experiment)) + 
  geom_ribbon(data = all_throw_summary, 
                 aes(y = mean, ymin = mean-ci,
                     ymax = mean+ci, fill = experiment), 
              alpha = 0.3) +
  geom_line(data = all_throw_summary, 
            aes(y = mean, colour = experiment)) +
  theme_minimal() +
  # scale_x_continuous(limits = c(205, 374)) +
  NULL

# ggplotly(p)
p
# save plot
# ggsave(p, height = 9, width = 16, device = "svg", filename = "data/figs/all_throws.svg")

2.2 Success manifolds

2.2.1 Without any tilts

# ggplotly(plot_success_manifold_no_tilt())
plot_success_manifold_no_tilt()

2.2.2 With tilt present

ggplotly(plot_success_manifold_tilt())
LS0tDQp0aXRsZTogIkJpbGxpYXJkcyBhbmQgVGlsdHMgQW5hbHlzaXMgTm90ZWJvb2siDQphdXRob3I6ICJTaGFuYWF0aGFuYW4gTW9kY2hhbGluZ2FtIg0KZGF0ZTogIkRlYyAwNiwgMjAyMSINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpybShsaXN0ID0gbHMoKSkgICAgICAjIGNsZWFuIGVudmlyb25tZW50DQoNCnNvdXJjZSgiLi4vc3JjL2hlbHBlcl9mdW5jcy5SIikNCnNvdXJjZSgiLi4vc2NyaXB0cy9maWd1cmVfZnVuY3MuUiIpIA0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdnYmVlc3dhcm0pDQpsaWJyYXJ5KGV6KSAjZm9yIEFOT1ZBcw0KbGlicmFyeShlZmZlY3RzaXplKSAjIGZvciBldGEtc3F1YXJlZA0KbGlicmFyeShwbG90bHkpDQoNCiMgdmFycw0Kb21uaWJ1c19wYXRoIDwtICIuLi9kYXRhL3Byb2Nlc3NlZC9vbW5pYnVzL29tbmlidXNfcmF3LmNzdiINCg0KYGBgDQoNCg0KDQojIyBMb2FkIGFsbCBvZiB0aGUgdGhyb3cgZGF0YQ0KDQoNCg0KYGBge3J9DQojbG9hZCBvbW5pYnVzIGRhdGFmcmFtZQ0Kb21uaWJ1c19kZiA8LSByZWFkX2RlbGltKCIuLi9kYXRhL3Byb2Nlc3NlZC9vbW5pYnVzL29tbmlidXNfcmF3LmNzdiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltID0gIiwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKC5kZWZhdWx0ID0gY29sX2RvdWJsZSgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcGlkID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwX2xhYmVsID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudCA9IGNvbF9mYWN0b3IoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfdGlsdCA9IGNvbF9mYWN0b3IoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfdGlsdCA9IGNvbF9mYWN0b3IoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGNvbF9mYWN0b3IoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltX3R5cGUgPSBjb2xfZmFjdG9yKCkpKQ0KDQpvcmlnaW5hbF9leHBzIDwtIGMoInJvdDE1X2N1ZWRfdGlsdCIsICJyb3QxNV91bmN1ZWQiLCAidGlsdF91bmN1ZWRfcm90IiwgDQogICAgICAgICAgICAgICAgICAgInRpbHRfdW5jdWVkX25vcm90IiwgInRpbHRfY3VlZF9yb3QiLCAidGlsdF9jdWVkX25vcm90IikNCmBgYA0KDQojIFZpc3VhbGl6aW5nIGRhdGEgKHVuaXZhcmlhdGUpDQoNCmBgYHtyfQ0KdGVzdF9wcHQgPC0gMw0KDQp0ZXN0X2RmIDwtIG9tbmlidXNfZGYgJT4lIGZpbHRlcihwcGlkID09IHRlc3RfcHB0KQ0KDQoNCnRyaWFsIDwtIDI1MA0KdHJpYWxfZGYgPC0gZmlsdGVyKHRlc3RfZGYsIHRyaWFsX251bSA9PSB0cmlhbCkNCg0KeCA8LSB0cmlhbF9kZiRmbGlja192ZWxvY2l0eV94DQp5IDwtIHRyaWFsX2RmJGZsaWNrX3ZlbG9jaXR5X3kNCnogPC0gdHJpYWxfZGYkZmxpY2tfdmVsb2NpdHlfeg0KDQp4MiA8LSB0cmlhbF9kZiRmbGlja19kaXJlY3Rpb25feA0KeTIgPC0gdHJpYWxfZGYkZmxpY2tfZGlyZWN0aW9uX3kNCnoyIDwtIHRyaWFsX2RmJGZsaWNrX2RpcmVjdGlvbl96DQoNCiMgcGxvdCBib3RoDQpwbG90X2x5KHggPSBjKDAsIHgpLCB5ID0gYygwLCB5KSwgeiA9IGMoMCwgeiksIHR5cGUgPSAic2NhdHRlcjNkIiwgbW9kZSA9ICJsaW5lcyIpICU+JQ0KICBhZGRfdHJhY2UoeCA9IGMoMCwgeDIpLCB5ID0gYygwLCB5MiksIHogPSBjKDAsIHoyKSwgdHlwZSA9ICJzY2F0dGVyM2QiLCBtb2RlID0gImxpbmVzIikgJT4lDQogIGxheW91dChzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gIngiKSwNCiAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAieSIpLA0KICAgICAgICAgICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJ6IikpKQ0KDQojIG5vdGU6IHRoaXMgaXMgYSByb3RhdGVkIHRyaWFsDQpgYGANCg0KDQpgYGB7cn0NCg0KYGBgDQoNCg0KYGBge3J9DQojIHBsb3QgZGlzdHJpYnV0aW9uIG9mIGVycm9yX3NpemUNCnAgPC0gZ2dwbG90KG9tbmlidXNfZGYsIGFlcyh4ID0gZXJyb3Jfc2l6ZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuNSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsNCiAgbGFicyh4ID0gIkVycm9yIFNpemUgKGNtKSIsIHkgPSAiQ291bnQiKQ0KDQpwDQpgYGANCg0KYGBge3J9DQoNCmBgYA0KDQpgYGB7cn0NCg0KDQoNCmBgYA0KDQojIEdyb3VwIA0KDQojIyBBbGwgdGhyb3dzDQoNCmBgYHtyfQ0KIyB0cnkganVzdCBhbmltYXRlX3N1cmZhY2UgZXhwDQphbmltYXRlX3N1cmZhY2VfdHJpYWxfc3VtbWFyeV9kZiA8LSBvbW5pYnVzX2RmICU+JQ0KICBmaWx0ZXIoZXhwX2xhYmVsID09ICJhbmltYXRlX3N1cmZhY2UiKSAlPiUNCiAgZ3JvdXBfYnkodHJpYWxfbnVtKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG1lYW5fZGV2aWF0aW9uID0gbWVhbih0aHJvd19kZXZpYXRpb24pLA0KICAgIGNpX2RldmlhdGlvbiA9IHZlY3Rvcl9jb25maW50KHRocm93X2RldmlhdGlvbikNCiAgKQ0KDQpkYXRhIDwtIGFuaW1hdGVfc3VyZmFjZV90cmlhbF9zdW1tYXJ5X2RmDQoNCiMgc2V0IHVwIHBsb3QNCnAgPC0gZGF0YSAlPiUNCiAgZ2dwbG90KA0KICAgIGFlcygNCiAgICAgIHggPSB0cmlhbF9udW0sIHkgPSBtZWFuX2RldmlhdGlvbg0KICAgICkNCiAgKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBsYWJzKA0KICAgIHggPSAiVHJpYWwgTnVtYmVyIiwNCiAgICB5ID0gIlRocm93IEFuZ2xlICjCsCkiDQogICkNCg0KIyBhZGQgaG9yaXpvbnRhbCBsaW5lcw0KcCA8LSBwICsNCiAgZ2VvbV9obGluZSgNCiAgICB5aW50ZXJjZXB0ID0gYygwLCAtMzApLCBsaW5ld2lkdGggPSAwLjQsDQogICAgY29sb3VyID0gIiNDQ0NDQ0MiLCBsaW5ldHlwZSA9ICJzb2xpZCINCiAgKSArDQogIGdlb21faGxpbmUoDQogICAgeWludGVyY2VwdCA9IGMoLTE1KSwgbGluZXdpZHRoID0gMC40LA0KICAgIGNvbG91ciA9ICIjQ0NDQ0NDIiwgbGluZXR5cGUgPSAiZGFzaGVkIg0KICApDQoNCiMgcCA8LSBwICsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMoDQojICAgICBsaW1pdHMgPSBjKC0xMCwgMzUpLA0KIyAgICAgYnJlYWtzID0gYygwLCAxNSwgMzApLA0KIyAgICAgbGFiZWxzID0gYygwLCAxNSwgMzApDQojICAgKSArDQojICAgc2NhbGVfeF9jb250aW51b3VzKA0KIyAgICAgbGltaXRzID0gYygwLCAxODApLA0KIyAgICAgYnJlYWtzID0gYygwLCA2MCwgMTIwLCAxODApLA0KIyAgICAgbGFiZWxzID0gYygwLCA2MCwgMTIwLCAxODApDQojICAgKQ0KDQojIHNldCBmb250IHNpemUgdG8gMTENCnAgPC0gcCArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSkNCg0KIyBhZGQgY29uZmlkZW5jZSBpbnRlcnZhbHMNCnAgPC0gcCArIGdlb21fcmliYm9uKA0KICBhZXMoDQogICAgeW1pbiA9IG1lYW5fZGV2aWF0aW9uIC0gY2lfZGV2aWF0aW9uLA0KICAgIHltYXggPSBtZWFuX2RldmlhdGlvbiArIGNpX2RldmlhdGlvbg0KICApLA0KICBmaWxsID0gIiNkNDAwMDAiLCBjb2xvdXIgPSBOQSwgYWxwaGEgPSAwLjMNCiAgKQ0KDQoNCiMgYWRkIGRhdGENCnAgPC0gcCArIGdlb21fbGluZShjb2xvdXIgPSAiI2Q0MDAwMCIpDQoNCg0KIyAjIHNhdmUNCiMgaWYgKHNhdmVfcGxvdHMpIHsNCiMgICBnZ3NhdmUoDQojICAgcCwNCiMgICBmaWxlbmFtZSA9ICIuLi9wbG90cy9wYXBlcl9maWdzL3NyXzMwX3RyYWluaW5nLnBkZiIsIGRldmljZSA9ICJwZGYiLA0KIyAgIGhlaWdodCA9IDQsIHdpZHRoID0gNg0KIyAgICkNCiMgICB9DQoNCmdncGxvdGx5KHApDQojIHANCmBgYA0KDQoNCg0KYGBge3J9DQojIHJlc3Qgb2YgdGhlIGV4cHMNCm9yaWdpbmFsX2V4cHNfdHJpYWxfc3VtbWFyeV9kZiA8LSBvbW5pYnVzX2RmICU+JQ0KICBmaWx0ZXIoZXhwX2xhYmVsID09ICJvcmlnaW5hbF9leHBzIikgJT4lDQogIGdyb3VwX2J5KGV4cGVyaW1lbnQsIHRyaWFsX251bSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWFuX2RldmlhdGlvbiA9IG1lYW4odGhyb3dfZGV2aWF0aW9uKSwNCiAgICBjaV9kZXZpYXRpb24gPSB2ZWN0b3JfY29uZmludCh0aHJvd19kZXZpYXRpb24pDQogICkNCg0KZGF0YSA8LSBvcmlnaW5hbF9leHBzX3RyaWFsX3N1bW1hcnlfZGYNCg0KIyBzZXQgdXAgcGxvdA0KcCA8LSBkYXRhICU+JQ0KICBnZ3Bsb3QoDQogICAgYWVzKA0KICAgICAgeCA9IHRyaWFsX251bSwgeSA9IG1lYW5fZGV2aWF0aW9uLCBjb2xvdXIgPSBleHBlcmltZW50DQogICAgKQ0KICApICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoDQogICAgeCA9ICJUcmlhbCBOdW1iZXIiLA0KICAgIHkgPSAiVGhyb3cgQW5nbGUgKMKwKSINCiAgKQ0KDQojIGFkZCBob3Jpem9udGFsIGxpbmVzDQpwIDwtIHAgKw0KICBnZW9tX2hsaW5lKA0KICAgIHlpbnRlcmNlcHQgPSBjKDAsIC0zMCksIGxpbmV3aWR0aCA9IDAuNCwNCiAgICBjb2xvdXIgPSAiI0NDQ0NDQyIsIGxpbmV0eXBlID0gInNvbGlkIg0KICApICsNCiAgZ2VvbV9obGluZSgNCiAgICB5aW50ZXJjZXB0ID0gYygtMTUpLCBsaW5ld2lkdGggPSAwLjQsDQogICAgY29sb3VyID0gIiNDQ0NDQ0MiLCBsaW5ldHlwZSA9ICJkYXNoZWQiDQogICkNCg0KIyBwIDwtIHAgKw0KIyAgIHNjYWxlX3lfY29udGludW91cygNCiMgICAgIGxpbWl0cyA9IGMoLTEwLCAzNSksDQojICAgICBicmVha3MgPSBjKDAsIDE1LCAzMCksDQojICAgICBsYWJlbHMgPSBjKDAsIDE1LCAzMCkNCiMgICApICsNCiMgICBzY2FsZV94X2NvbnRpbnVvdXMoDQojICAgICBsaW1pdHMgPSBjKDAsIDE4MCksDQojICAgICBicmVha3MgPSBjKDAsIDYwLCAxMjAsIDE4MCksDQojICAgICBsYWJlbHMgPSBjKDAsIDYwLCAxMjAsIDE4MCkNCiMgICApDQoNCiMgc2V0IGZvbnQgc2l6ZSB0byAxMQ0KcCA8LSBwICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQ0KDQojIGFkZCBjb25maWRlbmNlIGludGVydmFscw0KcCA8LSBwICsgZ2VvbV9yaWJib24oDQogIGFlcygNCiAgICB5bWluID0gbWVhbl9kZXZpYXRpb24gLSBjaV9kZXZpYXRpb24sDQogICAgeW1heCA9IG1lYW5fZGV2aWF0aW9uICsgY2lfZGV2aWF0aW9uLA0KICAgIGZpbGwgPSBleHBlcmltZW50DQogICksIGNvbG91ciA9IE5BLCBhbHBoYSA9IDAuMw0KICApDQoNCg0KIyBhZGQgZGF0YQ0KcCA8LSBwICsgZ2VvbV9saW5lKCkNCg0KDQojICMgc2F2ZQ0KIyBpZiAoc2F2ZV9wbG90cykgew0KIyAgIGdnc2F2ZSgNCiMgICBwLA0KIyAgIGZpbGVuYW1lID0gIi4uL3Bsb3RzL3BhcGVyX2ZpZ3Mvc3JfMzBfdHJhaW5pbmcucGRmIiwgZGV2aWNlID0gInBkZiIsDQojICAgaGVpZ2h0ID0gNCwgd2lkdGggPSA2DQojICAgKQ0KIyAgIH0NCg0KZ2dwbG90bHkocCkNCg0KIyBwDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3RseShwbG90X29yaWdpbmFsX2xlYXJuaW5nX2N1cnZlKG9tbmlidXNfcGF0aCkpDQpgYGANCg0KDQoNCg0KDQpQbG90IGFsbCB0aGUgdHJpYWxzIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGdyb3VwIGVmZmVjdHMuDQpgYGB7cn0NCmFsbF90aHJvd19zdW1tYXJ5IDwtIG9tbmlidXNfZGYgJT4lDQogIGdyb3VwX2J5KGV4cGVyaW1lbnQsIHRyaWFsX251bSkgJT4lDQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihlcnJvcl9zaXplLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgc2QgPSBzZChlcnJvcl9zaXplLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNpID0gdmVjdG9yX2NvbmZpbnQoZXJyb3Jfc2l6ZSksDQogICAgICAgICAgICBuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKQ0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OS41fQ0KcCA8LSBvbW5pYnVzX2RmICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB0cmlhbF9udW0sIHkgPSBlcnJvcl9zaXplKSkgKw0KICAjIGdlb21fcG9pbnQoYWxwaGEgPSAwLjA0LCBhZXMoY29sb3VyID0gZXhwZXJpbWVudCkpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBhbGxfdGhyb3dfc3VtbWFyeSwgDQogICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4tY2ksDQogICAgICAgICAgICAgICAgICAgICB5bWF4ID0gbWVhbitjaSwgZmlsbCA9IGV4cGVyaW1lbnQpLCANCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjMpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBhbGxfdGhyb3dfc3VtbWFyeSwgDQogICAgICAgICAgICBhZXMoeSA9IG1lYW4sIGNvbG91ciA9IGV4cGVyaW1lbnQpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogICMgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjA1LCAzNzQpKSArDQogIE5VTEwNCg0KIyBnZ3Bsb3RseShwKQ0KcA0KIyBzYXZlIHBsb3QNCiMgZ2dzYXZlKHAsIGhlaWdodCA9IDksIHdpZHRoID0gMTYsIGRldmljZSA9ICJzdmciLCBmaWxlbmFtZSA9ICJkYXRhL2ZpZ3MvYWxsX3Rocm93cy5zdmciKQ0KYGBgDQoNCiMjIFN1Y2Nlc3MgbWFuaWZvbGRzDQojIyMgV2l0aG91dCBhbnkgdGlsdHMNCmBgYHtyLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD0yMH0NCiMgZ2dwbG90bHkocGxvdF9zdWNjZXNzX21hbmlmb2xkX25vX3RpbHQoKSkNCnBsb3Rfc3VjY2Vzc19tYW5pZm9sZF9ub190aWx0KCkNCmBgYA0KDQojIyMgV2l0aCB0aWx0IHByZXNlbnQNCmBgYHtyLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD0yMH0NCmdncGxvdGx5KHBsb3Rfc3VjY2Vzc19tYW5pZm9sZF90aWx0KCkpDQpgYGANCg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCk5VTEwNCmBgYA0KDQo=